<?php
class auth extends DB
{

    function registr($login, $pass)
    {
        $err = array();

        # проверям логин
        if (!preg_match("/^[a-zA-Z0-9]+$/", $login))
        {
            $err[] = "Логин может состоять только из букв английского алфавита и цифр";
        }

        if (strlen($login) < 3 or strlen($login) > 30)
        {
            $err[] = "Логин должен быть не меньше 3-х символов и не больше 30";
        }

        # проверяем, не сущестует ли пользователя с таким именем
        $array = array(':value' => $login); 

        $this->prepare('SELECT COUNT(user_id) FROM users WHERE user_login=:value');
        $this->execute($array);
        $arr = $this->fetchAll(PDO::FETCH_ASSOC);

        if (mysql_result($query, 0) > 0)
        {
            $err[] = "Пользователь с таким логином уже существует в базе данных";
        }

        # Если нет ошибок, то добавляем в БД нового пользователя
        if (count($err) == 0)
        {

            # Убераем лишние пробелы и делаем двойное шифрование
            $password = md5(md5(trim($_POST['password'])));
            mysql_query("INSERT INTO users SET user_login='" . $login . "', user_password='" . $password . "'");
            header("Location: login.php");
            exit();
        } else
        {
            print "<b>При регистрации произошли следующие ошибки:</b><br>";
            foreach ($err as $error)
            {
                print $error . "<br>";
            }
        }
    }

    function login()
    {

        # Вытаскиваем из БД запись, у которой логин равняеться введенному
        $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='" . mysql_real_escape_string($_POST['login']) . "' LIMIT 1");
        $data = mysql_fetch_assoc($query);
        # Соавниваем пароли
        if ($data['user_password'] === md5(md5($_POST['password'])))
        {
            # Генерируем случайное число и шифруем его
            $hash = md5($this->code(10));
            if (!@$_POST['not_attach_ip'])
            {
                # Если пользователя выбрал привязку к IP
                # Переводим IP в строку
                $insip = ", user_ip=INET_ATON('" . $_SERVER['REMOTE_ADDR'] . "')";
            }

            # Записываем в БД новый хеш авторизации и IP
            mysql_query("UPDATE users SET user_hash='" . $hash . "' " . $insip . " WHERE user_id='" . $data['user_id'] . "'");

            # Ставим куки
            setcookie("id", $data['user_id'], time() + 60 * 60 * 24 * 30);
            setcookie("hash", $hash, time() + 60 * 60 * 24 * 30);

            # Переадресовываем браузер на страницу проверки нашего скрипта
            header("Location: check.php");
            exit();
        } else
        {
            print "Вы ввели неправильный логин/пароль";
        }

    }

    function check()
    {
        // Скрипт проверки
        if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
        {
            $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '" . intval($_COOKIE['id']) . "' LIMIT 1");
            $userdata = mysql_fetch_assoc($query);

            if (($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id']) or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['user_ip'] !== "0")))
            {
                setcookie("id", "", time() - 3600 * 24 * 30 * 12, "/");
                setcookie("hash", "", time() - 3600 * 24 * 30 * 12, "/");
                print "Хм, что-то не получилось";
            } else
            {
                print "Привет, " . $userdata['user_login'] . ". Всё работает!";
            }
        } else
        {
            print "Включите куки";
        }
    }

    function code($length)
    {
        // Страница авторизации
        # Функция для генерации случайной строки
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
        $code = "";
        $clen = strlen($chars) - 1;
        while (strlen($code) < $length)
        {
            $code .= $chars[mt_rand(0, $clen)];
        }
        return $code;

    }
}
?>